/*
 * Copyright (C) 2019 ~ 2019 Deepin Technology Co., Ltd.
 *
 * Author:     LZ <zhou.lu@archermind.com>
 *
 * Maintainer: LZ <zhou.lu@archermind.com>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <DApplication>
#include <DApplicationHelper>
#include <QPalette>
//#include <QStyleHelper>
#include <QDebug>
#include <QPaintEvent>
#include <QPainter>

#include "logviewheaderview.h"

static const int kSpacingMargin = 4;

LogViewHeaderView::LogViewHeaderView(Qt::Orientation orientation, QWidget *parent)
    : QHeaderView(orientation, parent)
{
    viewport()->setAutoFillBackground(false);
}
void LogViewHeaderView::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
{
    painter->save();
    painter->setRenderHint(QPainter::Antialiasing);
    painter->setOpacity(1);

    QPalette::ColorGroup cg;
#ifdef ENABLE_INACTIVE_DISPLAY
    QWidget *wnd = DApplication::activeWindow();
    if (!wnd) {
        cg = QPalette::Inactive;
    } else {
        cg = QPalette::Active;
    }
#else
    cg = QPalette::Active;
#endif

    //DApplicationHelper *dAppHelper = DApplicationHelper::instance();
    //QPalette palette = dAppHelper->applicationPalette();

    QStyle *style = dynamic_cast<QStyle *>(DApplication::style());

    QStyleOptionHeader option;
    initStyleOption(&option);
    //int margin = style->pixelMetric(QStyle::PM_ContentsMargins, &option);

    // title
    QRect contentRect(rect.x(), rect.y(), rect.width(), rect.height() - m_spacing);
    QRect hSpacingRect(rect.x(), contentRect.height(), rect.width(),
                       rect.height() - contentRect.height());

    //QBrush contentBrush(palette.color(cg, QPalette::Base));
    // horizontal spacing
    //QBrush hSpacingBrush(palette.color(cg, QPalette::FrameBorder));
    // vertical spacing
    //QBrush vSpacingBrush(palette.color(cg, QPalette::FrameBorder));
    QRectF vSpacingRect(rect.x(), rect.y() + kSpacingMargin, m_spacing,
                        rect.height() - kSpacingMargin * 2);
    //QBrush clearBrush(palette.color(cg, QPalette::Window));

    //painter->fillRect(hSpacingRect, clearBrush);
    //painter->fillRect(hSpacingRect, hSpacingBrush);

    if (visualIndex(logicalIndex) > 0) {
        //painter->fillRect(vSpacingRect, clearBrush);
        //painter->fillRect(vSpacingRect, vSpacingBrush);
    }

    QPen forground;
    //forground.setColor(palette.color(cg, QPalette::Text));
    // TODO: dropdown icon (8x5)
    QRect textRect;
    if (sortIndicatorSection() == logicalIndex) {
        //textRect = {contentRect.x() + margin, contentRect.y(), contentRect.width() - margin * 3 - 8,
        //            contentRect.height()};
    } else {
        //textRect = {contentRect.x() + margin, contentRect.y(), contentRect.width() - margin,
        //            contentRect.height()};
    }
    QString title = model()->headerData(logicalIndex, orientation(), Qt::DisplayRole).toString();
    //    int align = model()->headerData(logicalIndex, orientation(),
    //    Qt::TextAlignmentRole).toInt();
    int align = Qt::AlignLeft | Qt::AlignVCenter;

    painter->setPen(forground);

    if (logicalIndex == 0) {
        QRect col0Rect = textRect;
        //col0Rect.setX(textRect.x() + margin - 2);
        painter->drawText(col0Rect, static_cast<int>(align), title);
    } else {
        painter->drawText(textRect, static_cast<int>(align), title);
    }

    // sort indicator
    if (isSortIndicatorShown() && logicalIndex == sortIndicatorSection()) {
        // TODO: arrow size (8x5)
        //QRect sortIndicator(textRect.x() + textRect.width() + margin,
        //                    textRect.y() + (textRect.height() - 5) / 2, 8, 5);
        //option.rect = sortIndicator;
        if (sortIndicatorOrder() == Qt::DescendingOrder) {
            style->drawPrimitive(QStyle::PE_IndicatorArrowDown, &option, painter, this);
        } else if (sortIndicatorOrder() == Qt::AscendingOrder) {
            style->drawPrimitive(QStyle::PE_IndicatorArrowUp, &option, painter, this);
        }
    }

    painter->restore();
}

void LogViewHeaderView::paintEvent(QPaintEvent *event)
{
    QPainter painter(viewport());
    painter.save();

    QPalette::ColorGroup cg;
#ifdef ENABLE_INACTIVE_DISPLAY
    QWidget *wnd = DApplication::activeWindow();
    if (!wnd) {
        cg = QPalette::Inactive;
    } else {
        cg = QPalette::Active;
    }
#else
    cg = QPalette::Active;
#endif

    //DApplicationHelper *dAppHelper = DApplicationHelper::instance();
    //QPalette palette = dAppHelper->applicationPalette();

    QStyle *style = dynamic_cast<QStyle *>(DApplication::style());

    //QBrush bgBrush(palette.color(cg, QPalette::Base));

    QStyleOptionHeader option;
    initStyleOption(&option);
    //int radius = style->pixelMetric(QStyle::PM_FrameRadius, &option);

    QRect rect = viewport()->rect();
    QRectF clipRect(rect.x(), rect.y(), rect.width(), rect.height() * 2);
    QRectF subRect(rect.x(), rect.y() + rect.height(), rect.width(), rect.height());
    QPainterPath clipPath, subPath;
    //clipPath.addRoundedRect(clipRect, radius, radius);
    subPath.addRect(subRect);
    clipPath = clipPath.subtracted(subPath);

    //painter.fillPath(clipPath, bgBrush);

    painter.restore();
    QHeaderView::paintEvent(event);
}

QSize LogViewHeaderView::sizeHint() const
{
    return QSize(width(), 36 + m_spacing);
}

int LogViewHeaderView::sectionSizeHint(int logicalIndex) const
{
    QStyleOptionHeader option;
    initStyleOption(&option);
    QStyle *style = dynamic_cast<QStyle *>(DApplication::style());
    //int margin = style->pixelMetric(QStyle::PM_ContentsMargins, &option);

    QFontMetrics fm(DApplication::font());
    QString buf = model()->headerData(logicalIndex, Qt::Horizontal, Qt::DisplayRole).toString();
    return fm.width(buf);
    /*if (sortIndicatorSection() == logicalIndex) {
        return fm.width(buf) + margin * 3 + 8;
    } else {
        return fm.width(buf) + margin * 2;
    }*/
}
